
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如何在Nginx中实现基于用户认证的访问控制？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如何在Nginx中实现基于用户认证的访问控制？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Nginx中实现HTTP基本认证，需要使用哪两个核心指令，它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">需要使用`auth_basic`和`auth_basic_user_file`两个指令。`auth_basic`用于设置当用户访问受保护区域时显示的提示消息；`auth_basic_user_file`则用于指定包含用户名和加密密码的文件路径。</div>
          </div>
          <div class="card-source">来源: 1.2 配置 Nginx 进行基本认证</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何使用`htpasswd`工具创建一个新的密码文件，以及如何向一个已存在的文件中添加新用户？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">要创建一个新的密码文件，应使用带`-c`选项的命令，例如 `htpasswd -c /etc/nginx/.htpasswd username`。如果文件已经存在，需要向其中添加新用户时，则应省略`-c`选项。</div>
          </div>
          <div class="card-source">来源: 1.1 创建密码文件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当需要实现如OAuth或JWT这类复杂认证时，Nginx本身不支持，文档中提到了哪种实现方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到可以使用Nginx的`nginx-auth-request`模块。该模块允许将认证请求代理到后端的认证服务，从而实现与外部认证系统的集成。</div>
          </div>
          <div class="card-source">来源: 2.1 使用 Nginx 认证模块</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">除了基于用户的认证，Nginx还提供了哪种简单的访问控制方法，并如何配置以实现“仅允许特定网段访问”？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nginx还支持配置IP白名单和黑名单。要实现“仅允许特定网段访问”，可以使用`allow`指令指定允许的IP地址或网段（如 `allow 192.168.1.0/24;`），并紧接着使用`deny all;`来拒绝所有其他IP地址的访问。</div>
          </div>
          <div class="card-source">来源: 3. 配置 IP 白名单和黑名单</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在为Nginx启用用户认证功能时，为什么强烈建议同时配置HTTPS？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为配置HTTPS（SSL/TLS）可以加密客户端与服务器之间传输的数据。这对于保护通过HTTP基本认证等方式传输的用户名和密码等敏感信息至关重要，能有效提高系统的安全性。</div>
          </div>
          <div class="card-source">来源: 4.1 配置 HTTPS</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在`nginx-auth-request`模块的配置中，`auth_request`指令的具体作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`auth_request`指令用于指定一个内部的location，Nginx会将每个外部请求先转发到这个location进行认证检查。该location通常会代理到一个外部的认证服务。</div>
          </div>
          <div class="card-source">来源: 2.1 使用 Nginx 认证模块</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Nginx中启用HTTPS需要配置哪两个关键的SSL指令？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">启用HTTPS需要配置`ssl_certificate`和`ssl_certificate_key`两个指令。`ssl_certificate`用于指定SSL证书文件的路径，而`ssl_certificate_key`用于指定SSL证书密钥文件的路径。</div>
          </div>
          <div class="card-source">来源: 4.1 配置 HTTPS</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中提到Nginx Plus相对于开源版Nginx，在身份验证方面有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nginx Plus提供了内置的访问控制和身份验证功能，可以直接集成OAuth2和其他身份验证方案，而开源版Nginx则需要依赖第三方模块或与认证服务结合使用。</div>
          </div>
          <div class="card-source">来源: 2.2 使用 Nginx Plus</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如果用户访问一个需要认证的路径但认证失败，`nginx-auth-request`模块的配置示例中是如何处理这种情况的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">示例中通过`error_page 401 = /error401;`指令来处理认证失败的情况（认证服务返回401）。当认证失败时，请求会被内部重定向到`/error401`这个location，该location最终会向客户端返回403 Forbidden状态码。</div>
          </div>
          <div class="card-source">来源: 2.1 使用 Nginx 认证模块</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
